#include <stdio.h>
#include <stdlib.h>

// 定义队列的最大容量
#define MAX_SIZE 100

// 定义队列结构体
typedef struct
{
    int data[MAX_SIZE]; // 存储队列元素的数组
    int front;          // 队首指针
    int rear;           // 队尾指针
    int size;           // 当前队列中的元素数量
} Queue;

// 初始化队列
void initQueue(Queue *q)
{
    q->front = 0; // 队首指针初始位置为0
    q->rear = -1; // 队尾指针初始位置为-1（表示队列为空）
    q->size = 0;  // 初始时队列中没有元素
}

// 检查队列是否为空
int isEmpty(Queue *q)
{
    return q->size == 0; // 如果队列中的元素数量为0，返回1（真），否则返回0（假）
}

// 检查队列是否已满
int isFull(Queue *q)
{
    return q->size == MAX_SIZE; // 如果队列中的元素数量等于最大容量，返回1（真），否则返回0（假）
}

// 入队操作
void enqueue(Queue *q, int value)
{
    if (isFull(q))
    { // 如果队列已满，打印错误信息并返回
        printf("队列已满\n");
        return;
    }
    q->rear = (q->rear + 1) % MAX_SIZE; // 计算新的队尾位置（使用取模操作实现循环）
    q->data[q->rear] = value;           // 将新元素放入队尾位置
    q->size++;                          // 队列中的元素数量加1
}

// 出队操作
int dequeue(Queue *q)
{
    if (isEmpty(q))
    { // 如果队列为空，打印错误信息并返回-1
        printf("队列为空\n");
        return -1;
    }
    int value = q->data[q->front];        // 获取队首元素
    q->front = (q->front + 1) % MAX_SIZE; // 计算新的队首位置（使用取模操作实现循环）
    q->size--;                            // 队列中的元素数量减1
    return value;                         // 返回出队的元素
}

// 获取队首元素
int front(Queue *q)
{
    if (isEmpty(q))
    { // 如果队列为空，打印错误信息并返回-1
        printf("队列为空\n");
        return -1;
    }
    return q->data[q->front]; // 返回队首元素
}

// 主函数
int main()
{
    Queue q;
    initQueue(&q); // 初始化队列

    // 入队操作
    enqueue(&q, 1);
    enqueue(&q, 2);
    enqueue(&q, 3);

    // 输出队首元素
    printf("队首元素: %d\n", front(&q));

    // 出队操作
    printf("出队: %d\n", dequeue(&q));
    printf("出队: %d\n", dequeue(&q));

    // 再次输出队首元素
    printf("新的队首元素: %d\n", front(&q));

    return 0;
} 